图论经典算法(通俗易懂):最短路径和最小生成树

一、最短路问题

求图的最短路问题,几乎是图论的必学内容,而且在算法分析与设计中也会涉及。很多书上内容,实在没法看,我们的图论教材,更是编的非常糟糕,吐槽,为啥要用自己学校编的破教材,不过据说下一届终于要换书了。

言归正传,开始说明最短路问题。

1.问题描述:

对一幅图G,我们对每一条边赋权w(e),成为一个赋权图。H是G的一个子图,则W(H) = sigma(w(e)),也就是对每条边的权求和。寻找从一个点a到另一个b的一个子图,使得权和最小,即为最短路问题。

2.算法描述:

Dijkstra(迪杰斯特拉算法算法):

image.png
我表示看到后,是懵逼的,接下来详细分析下。

算法图解:

其实就是不断求一个点集合中的每个点,和与他相邻点最短路的最小值。我们还是从实例出发,更容易讲解。我会把上述步骤,拆解为多步。我们求下面这个图从A到L的最短路。
image.png

  • 第一步:
    令a1 = A(便于标记),t(a1) = 0(表示点a1到a的最短路),S={a1}(被选择的点的集合),T = 0(空集 表示被选择的最短路的边集)。
    image.png
  • 第二步:
    求与S中的点a1与他相邻的点的距离d,取点a2 = C使得距离最小。令S={a1,a2},T={AC}。
    image.png
  • 第三步:
    重复第二步,求S中的点a1,a2的相邻点中(去除已选择点),距离最小的那个,则为AB,CE。再取AB,CE中权和最小的一个,B,所以a3=B,令S={a1,a2,a3},T={AC,AB}。

  • 持续下去,不断寻找,S集合中的每个点与他相邻点的最小距离,然后再这些最小距离中找到最小的那个加入到S中,同时加入相应的边。
    image.png
    image.png
    直到到达终点L为止。最后得到的最短路为:
    image.png
此算法是多项式时间可求解的,

关于算法的实现可以在参考资料中找到。

二、最小生成树

问题描述

同样在一个连通赋权图中,寻找一颗生成树使得权和最小。
此算法比较简单,很容易理解。

算法描述:

Kruskal算法:
image.png
不断寻找最小权的边即可。

比如,寻找下图的最小生成树。
image.png
结果如下
image.png

参考资料

1.https://blog.csdn.net/u012469987/article/details/51319574
2.https://www.cnblogs.com/hxsyl/p/3270401.html

  • 19
    点赞
  • 147
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
### 回答1: 图的最短路径算法指的是在一张带权图中,求出两个结点之间的最短路径。常见的最短路径算法Dijkstra 算法、贝尔曼-福德算法(Bellman-Ford algorithm)、弗洛伊德算法(Floyd algorithm)等。 Dijkstra 算法是一种贪心算法,它的基本思路是从起点开始,每次找出距离起点最近的未标记点并标记,然后更新其他点到起点的距离。实现时,可以使用堆来优化时间复杂度。 贝尔曼-福德算法是一种动态规划算法,它的基本思路是每次求出从起点到每个点的最短路径,然后从这些最短路径中求出更优的解。实现时,可以使用数组来存储每个点到起点的距离,然后每次更新数组中的值。 弗洛伊德算法是一种多源最短路径算法,它的基本思路是枚举所有点对之间的最短路径,然后从这些最短路径中求出更优的解。实现时,可以使用数组来存储点对之间的最短路径长度,然后每次更新数组中的值。 最小生成树算 ### 回答2: 图的最短路径算法是用于找到图中两个顶点之间具有最小权重的路径的算法。其中最经典算法Dijkstra算法和Bellman-Ford算法Dijkstra算法的原理是通过逐步扩展路径来找到从一个起点到其他所有顶点的最短路径。该算法维护一个距离表,记录起点到每个顶点的当前最短距离。算法从起点开始,每次选择当前距离最小的顶点进行扩展,并更新距离表。直到到达目标顶点或所有顶点都被扩展完成。Dijkstra算法使用了贪心的策略,每次都选择当前最优的顶点进行扩展,保证路径一直是最短的。 Bellman-Ford算法的原理是通过进行多轮松弛操作来找到从一个起点到其他所有顶点的最短路径。该算法首先初始化距离表,将起点距离设置为0,其他顶点距离设置为无穷大。接下来进行多轮松弛操作,每轮都对图的所有边进行松弛操作,即尝试通过当前边缩短起点到终点的距离。重复进行多轮松弛操作直到没有可更新的路径。Bellman-Ford算法可以处理含有负权边的图。 最小生成树算法是用于找到图中连接所有顶点的子图,并且保证子图的边权和最小的算法。其中最经典算法是Prim算法Kruskal算法。 Prim算法的原理是从一个起始顶点开始,每次选择一个和当前子图相连的顶点中权值最小的边,并将该边加入最小生成树中。重复该过程直到所有顶点都被加入最小生成树Kruskal算法的原理是将图的所有边进行排序,然后从最小的边开始逐个加入最小生成树,但是要保证加入的边不会导致形成环。通过维护一个并查集数据结构来判断两个顶点是否在同一个连通分量中。 这些算法可以通过不同的数据结构和优化策略进行实现。例如,可以使用堆来加速Dijkstra算法和Prim算法中选择最小边的过程。另外,还可以使用动态规划等方法对这些算法进行优化,减少时间复杂度。 ### 回答3: 图的最短路径最小生成树算法图论中两个重要的算法。图是由一些顶点和边组成的集合,最短路径算法用于找到两个顶点之间的最短路径最小生成树算法用于找到一个连通图的生成树,使得生成树的边权重之和最小。 最短路径算法中,Dijkstra算法是比较常用的方法。它从一个起点出发,逐步扩展到其他顶点,通过贪心策略选择当前路径权重最小的顶点进行扩展。在Dijkstra算法中,需要维护一个距离数组来记录起点到各个顶点的当前最短路径长度,并使用一个优先队列来选择下一个要扩展的顶点,直到找到终点或所有顶点都被扩展。 最小生成树算法中,Prim算法Kruskal算法是两种常见的方法。Prim算法从一个起始顶点开始,每次选择与当前生成树相连的边中权重最小的边,并将其连接的顶点加入生成树中,直到所有顶点都被加入。Kruskal算法则是先将所有边按照权重从小到大进行排序,然后从最小权重的边开始,逐步加入生成树中,直到生成树中的边数为顶点数减一。 实现最短路径算法最小生成树算法需要根据图的具体表示方式进行编程。一般来说,我们可以使用邻接矩阵或邻接表来表示图,并在此基础上实现算法。在计算最短路径时,需要注意处理负权边和处理无连接的情况。在计算最小生成树时,需要注意处理图不连通的情况。 总之,最短路径算法最小生成树算法是解决图论问题的重要工具,通过选择顶点和边的策略,可以找到图中最短路径最小生成树。在实际应用中,这两个算法具有广泛的应用,比如网络路由、电力传输等领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

linxid

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值